;KernelLoad Module for EXOS
;Copyright yywd_123 2020-2022
    org 0x800

    mov ah,0x00
    mov al,0x13
    int 10

    ;开始进入32位保护模式
    cli             ;屏蔽中断

    lgdt [gdt_info] ;初始化gdt

    ;把cr0最低位置为1,开启保护模式
    mov eax,cr0
    or eax,0x1
    mov cr0,eax

    jmp 0x08:LoaderMain

[bits 32]
LoaderMain:
    mov ax,0x10     ;将寄存器的值置为0x10
    mov dx,ax
    mov es,ax
    mov fs,ax
    mov gs,ax
    
    mov ax,0x18     ;初始化堆栈
    mov ss,ax
    mov ebp,0x7c00
    mov esp,ebp

    push msg_osver
    call print

Halt:
    hlt
    jmp Halt

print:              ;打印指定的字符串
    push ebp
    mov ebp,esp
    mov ebx,[ebp+8] ;[ebp+8]为要打印的字符串地址
    xor ecx,ecx
    mov ah,0x0f     ;字的颜色，0x0f为黑底白字
    mov edx,0xb8000 ;显存地址

print_loop:
    mov al,[ebx]
    cmp al,0
    je print_end
    mov [edx],ax
    inc ebx
    add edx,2
    jmp print_loop

print_end:
    mov esp,ebp
    pop ebp
    ret

msg_osver  db "EXOS v0.1a build 1000 By yywd_123",0

gdt_start:
;空描述符

gdt_null:
    dq 0

gdt_code:
    dw 0xffff
    dw 0
    db 0
    db 10011010b
    db 11001111b
    db 0

gdt_data:
    dw 0xffff
    dw 0
    db 0
    db 10010010b
    db 11001111b
    db 0

gdt_stack:
    dw 0x7c00
    dw 0
    db 0
    db 10010010b
    db 01000000b
    db 0

gdt_end:
gdt_info:
    dw gdt_end - gdt_start -1   ;GDT表的大小
    dd gdt_start                ;GDT表的起始地址